import abc
import sqlite3
from typing import Any
from langchain.tools import BaseTool

# 定义数据库文件常量，方便后续修改
DB_FILE = 'timer.db'

class QueryTimerDB(BaseTool, abc.ABC):
    name: str = "QueryTimerDB"
    description: str = "用于查询所有日程，返回的数据里包含3个参数:时间、循环规则（如:'1000100'代表星期一和星期五循环，'0000000'代表不循环）、执行的事项"

    def __init__(self):
        super().__init__()
        # 在初始化时创建表，确保表存在
        self._create_table()

    def _create_table(self):
        """创建 timer 表（如果不存在）"""
        try:
            # 使用上下文管理器管理数据库连接，确保连接自动关闭
            with sqlite3.connect(DB_FILE) as conn:
                cursor = conn.cursor()
                cursor.execute('''
                    CREATE TABLE IF NOT EXISTS timer (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        time TEXT NOT NULL,
                        repeat_rule TEXT NOT NULL,
                        content TEXT NOT NULL,
                        uid INTEGER NOT NULL
                    )
                ''')
        except sqlite3.Error as e:
            # 打印创建表时的错误信息
            print(f"创建表时出错: {e}")

    async def _arun(self, *args: Any, **kwargs: Any) -> Any:
        # 用例中没有用到 arun 不予具体实现
        pass

    def _run(self, para: Any) -> str:
        try:
            # 执行查询操作
            rows = self._query_data()
            # 处理查询结果
            result = self._format_result(rows)
            return result
        except sqlite3.Error as e:
            # 捕获数据库操作时的错误并返回错误信息
            return f"数据库查询出错: {e}"

    def _query_data(self):
        """执行数据库查询操作"""
        with sqlite3.connect(DB_FILE) as conn:
            cursor = conn.cursor()
            cursor.execute("SELECT time, repeat_rule, content FROM timer")
            return cursor.fetchall()

    def _format_result(self, rows):
        """格式化查询结果"""
        if not rows:
            return "未找到日程记录。"
        result = ""
        for row in rows:
            time, repeat_rule, content = row
            # 更清晰的结果格式化，方便阅读
            result += f"时间: {time}, 循环规则: {repeat_rule}, 事项: {content}\n"
        return result


if __name__ == "__main__":
    tool = QueryTimerDB()
    result = tool._run("")
    print(result)